home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / rhinosrc.lha / files.c < prev    next >
C/C++ Source or Header  |  1993-06-09  |  10KB  |  333 lines

  1. /* System-dependent definitions of various files, spool directories, etc */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "netuser.h"
  5. #include "files.h"
  6. #include "dirutil.h"
  7.  
  8. #ifdef    MSDOS
  9. char *Startup = "/autoexec.net";    /* Initialization file */
  10. char *Userfile = "/ftpusers";    /* Authorized FTP users and passwords */
  11. char *Maillog = "/spool/mail.log";    /* mail log */
  12. char *Mailspool = "/spool/mail";    /* Incoming mail */
  13. char *Mailqdir = "/spool/mqueue";        /* Outgoing mail spool */
  14. char *Mailqueue = "/spool/mqueue/*.wrk";    /* Outgoing mail work files */
  15. char *Routeqdir = "/spool/rqueue";        /* queue for router */
  16. char *Alias = "/alias";        /* the alias file */
  17. char *Dfile = "/domain.txt";    /* Domain cache */
  18. char *Fdir = "/finger";        /* Finger info directory */
  19. char *Arealist = "/spool/areas";/* List of message areas */
  20. char *Helpdir = "/spool/help";    /* Mailbox help file directory */
  21. char *Rewritefile = "/spool/rewrite"; /* Address rewrite file */
  22. char *Newsdir = "/spool/news";        /* News messages and NNTP data */
  23. char *Popusers = "/popusers";        /* POP user and passwd file */
  24. char *Signature = "/spool/signatur"; /* Mail signature file directory */
  25. char *Forwardfile = "/spool/forward.bbs"; /* Mail forwarding file */
  26. char *Historyfile = "/spool/history"; /* Message ID history file */
  27. char *Tmpdir = "/tmp";
  28. char Eol[] = "\r\n";
  29. #define    SEPARATOR    "/"
  30. #endif
  31.  
  32. #ifdef    UNIX
  33. char *Startup = "./startup.net";    /* Initialization file */
  34. char *Config = "./config.net";    /* Device configuration list */
  35. char *Userfile = "./ftpusers";
  36. char *Mailspool = "./mail";
  37. char *Maillog = "./mail.log";    /* mail log */
  38. char *Mailqdir = "./mqueue";
  39. char *Mailqueue = "./mqueue/*.wrk";
  40. char *Routeqdir = "./rqueue";        /* queue for router */
  41. char *Alias = "./alias";    /* the alias file */
  42. char *Dfile = "./domain.txt";    /* Domain cache */
  43. char *Fdir = "./finger";        /* Finger info directory */
  44. char *Arealist = "./areas";        /* List of message areas */
  45. char *Helpdir = "./help";    /* Mailbox help file directory */
  46. char *Rewritefile = "./rewrite"; /* Address rewrite file */
  47. char *Newsdir = "./news";        /* News messages and NNTP data */
  48. char *Popusers = "./popusers";        /* POP user and passwd file */
  49. char *Signature = "./signatur"; /* Mail signature file directory */
  50. char *Forwardfile = "./forward.bbs"; /* Mail forwarding file */
  51. char *Historyfile = "./history"; /* Message ID history file */
  52. char *Tmpdir = "/tmp";
  53. #define    SEPARATOR    "/"
  54. char Eol[] = "\n";
  55. #endif
  56.  
  57. #ifdef    AMIGA
  58. char *Startup = "TCPIP:net-startup";
  59. char *Config = "TCPIP:config.net";    /* Device configuration list */
  60. char *Userfile = "TCPIP:ftpusers";
  61. char *Mailspool = "TCPIP:spool/mail";
  62. char *Maillog = "TCPIP:spool/mail.log";
  63. char *Mailqdir = "TCPIP:spool/mqueue";
  64. char *Mailqueue = "TCPIP:spool/mqueue/*.wrk";
  65. char *Routeqdir = "TCPIP:spool/rqueue";        /* queue for router */
  66. char *Alias = "TCPIP:alias";    /* the alias file */
  67. char *Dfile = "TCPIP:domain.txt";    /* Domain cache */
  68. char *Fdir = "TCPIP:finger";        /* Finger info directory */
  69. char *Arealist = "TCPIP:spool/areas";    /* List of message areas */
  70. char *Helpdir = "TCPIP:spool/help";    /* Mailbox help file directory */
  71. char *Rewritefile = "TCPIP:spool/rewrite"; /* Address rewrite file */
  72. char *Newsdir = "TCPIP:spool/news";    /* News messages and NNTP data */
  73. char *Popusers = "TCPIP:/popusers";    /* POP user and passwd file */
  74. char *Signature = "TCPIP:spool/signatur"; /* Mail signature file directory */
  75. char *Forwardfile = "TCPIP:spool/forward.bbs"; /* Mail forwarding file */
  76. char *Historyfile = "TCPIP:spool/history"; /* Message ID history file */
  77. char *Tmpdir = "TCPIP:tmp";
  78. #define    SEPARATOR    "/"
  79. char Eol[] = "\n";
  80. #endif
  81.  
  82. #ifdef    MAC
  83. char *Startup ="Mikes Hard Disk:net.start";
  84. char *Config = "Mikes Hard Disk:config.net";    /* Device configuration list */
  85. char *Userfile = "Mikes Hard Disk:ftpusers";
  86. char *Mailspool = "Mikes Hard Disk:spool:mail:";
  87. char *Maillog = "Mikes Hard Disk:spool:mail.log:";
  88. char *Mailqdir = "Mikes Hard Disk:spool:mqueue:";
  89. char *Mailqueue = "Mikes Hard Disk:spool:mqueue:*.wrk";
  90. char *Routeqdir = "Mikes Hard Disk:spool/rqueue:";    /* queue for router */
  91. char *Alias = "Mikes Hard Disk:alias";    /* the alias file */
  92. char *Dfile = "Mikes Hard Disk:domain:txt";    /* Domain cache */
  93. char *Fdir = "Mikes Hard Disk:finger";        /* Finger info directory */
  94. char *Arealist = "Mikes Hard Disk:spool/areas";    /* List of message areas */
  95. char *Helpdir = "Mikes Hard Disk:spool/help"; /* Mailbox help file directory */
  96. char *Rewritefile = "Mikes Hard Disk:spool/rewrite"; /* Address rewrite file */
  97. char *Newsdir = "Mikes Hard Disk:spool/news"; /* News messages and NNTP data */
  98. char *Popusers = "Mikes Hard Disk:/popusers";    /* POP user and passwd file */
  99. char *Signature = "Mikes Hard Disk:spool/signatur"; /* Mail signature file directory */
  100. char *Forwardfile = "Mikes Hard Disk:spool/forward.bbs"; /* Mail forwarding file */
  101. char *Historyfile = "Mikes Hard Disk:spool/history"; /* Message ID history file */
  102. char *Tmpdir = "Mikes Hard Disk:tmp";
  103. #define    SEPARATOR    "/"
  104. char Eol[] = "\r";
  105. #endif
  106.  
  107. static char *rootdir = "";
  108.  
  109. /* Establish a root directory other than the default. Can only be called
  110.  * once, at startup time
  111.  */
  112. void
  113. initroot(root)
  114. char *root;
  115. {
  116.     rootdir = strdup( root );
  117.  
  118.     Startup = rootdircat(Startup);
  119.     Userfile = rootdircat(Userfile);
  120.     Maillog = rootdircat(Maillog);
  121.     Mailspool = rootdircat(Mailspool);
  122.     Mailqdir = rootdircat(Mailqdir);
  123.     Mailqueue = rootdircat(Mailqueue);
  124.     Routeqdir = rootdircat(Routeqdir);
  125.     Alias = rootdircat(Alias);
  126.     Dfile = rootdircat(Dfile);
  127.     Fdir = rootdircat(Fdir);
  128.     Arealist = rootdircat(Arealist);
  129.     Helpdir = rootdircat(Helpdir);
  130.     Rewritefile = rootdircat(Rewritefile);
  131.     Newsdir = rootdircat(Newsdir);
  132.     Signature = rootdircat(Signature);
  133.     Forwardfile = rootdircat(Forwardfile);
  134.     Historyfile = rootdircat(Historyfile);
  135. }
  136.  
  137. /* Concatenate root, separator and arg strings into a malloc'ed output
  138.  * buffer, then remove repeated occurrences of the separator char
  139.  */
  140. char *
  141. rootdircat(filename)
  142. char *filename;
  143. {
  144. #ifdef notdef
  145.     char *out = filename;
  146.  
  147.     if ( strlen(rootdir) > 0 ) {
  148.         char *separator = SEPARATOR;
  149.  
  150.         out = mallocw( strlen(rootdir)
  151.                 + strlen(separator)
  152.                 + strlen(filename) + 1);
  153.  
  154.         strcpy(out,rootdir);
  155.         strcat(out,separator);
  156.         strcat(out,filename);
  157.         if(*separator != '\0'){
  158.             char *p1, *p2;
  159.  
  160.             /* Remove any repeated occurrences */
  161.             p1 = p2 = out;
  162.             while(*p2 != '\0'){
  163.                 *p1++ = *p2++;
  164.                 while(p2[0] == p2[-1] && p2[0] == *separator)
  165.                     p2++;
  166.             }
  167.             *p1 = '\0';
  168.         }
  169.     }
  170.     return out;
  171. #else
  172. #ifdef AMIGA
  173.     /* Assumes default filenames are absolute.
  174.      * Remove the device/assign name.
  175.      */
  176.     filename = strchr(filename,':');
  177. #endif    
  178.     return pathname(rootdir,filename);
  179. #endif
  180. }
  181.  
  182. /* Read through FTPUSERS looking for user record
  183.  * Returns line which matches username, or NULLCHAR when no match.
  184.  * Each of the other variables must be copied before freeing the line.
  185.  */
  186. char *
  187. userlookup(username,password,directory,permission,ip_address)
  188. char *username;
  189. char **password;
  190. char **directory;
  191. int   *permission;
  192. int32 *ip_address;
  193. {
  194.     FILE *fp;
  195.     char *buf;
  196.     char *cp;
  197.  
  198.     if((fp = fopen(Userfile,READ_TEXT)) == NULLFILE)
  199.         /* Userfile doesn't exist */
  200.         return NULLCHAR;
  201.  
  202.     buf = mallocw(128);
  203.     while ( fgets(buf,128,fp) != NULLCHAR ){
  204.         if(*buf == '#')
  205.             continue;    /* Comment */
  206.  
  207.         if((cp = strchr(buf,' ')) == NULLCHAR)
  208.             /* Bogus entry */
  209.             continue;
  210.         *cp++ = '\0';        /* Now points to password */
  211.  
  212.         if( stricmp(username,buf) == 0 )
  213.             break;        /* Found user */
  214.     }
  215.     if(feof(fp)){
  216.         /* username not found in file */
  217.         fclose(fp);
  218.         free(buf);
  219.         return NULLCHAR;
  220.     }
  221.     fclose(fp);
  222.  
  223.     if ( password != NULL )
  224.         *password = cp;
  225.  
  226.     /* Look for space after password field in file */
  227.     if((cp = strchr(cp,' ')) == NULLCHAR) {
  228.         /* Invalid file entry */
  229.         free(buf);
  230.         return NULLCHAR;
  231.     }
  232.     *cp++ = '\0';    /* Now points to directory field */
  233.  
  234.     if ( directory != NULL )
  235.         *directory = cp;
  236.  
  237.     if((cp = strchr(cp,' ')) == NULLCHAR) {
  238.         /* Permission field missing */
  239.         free(buf);
  240.         return NULLCHAR;
  241.     }
  242.     *cp++ = '\0';    /* now points to permission field */
  243.  
  244.     if ( permission != NULL )
  245.         *permission = (int)strtol( cp, NULLCHARP, 0 );
  246.  
  247.     if((cp = strchr(cp,' ')) == NULLCHAR) {
  248.         /* IP address missing */
  249.         if ( ip_address != NULL )
  250.             *ip_address = 0L;
  251.     } else {
  252.         *cp++ = '\0';    /* now points at IP address field */
  253.         if ( ip_address != NULL )
  254.             *ip_address = resolve( cp );
  255.     }
  256.     return buf;
  257. }
  258.  
  259. /* Subroutine for logging in the user whose name is name and password is pass.
  260.  * The buffer path should be long enough to keep a line from the userfile.
  261.  * If pwdignore is true, the password check will be overridden.
  262.  * The return value is the permissions field or -1 if the login failed.
  263.  * Path is set to point at the path field, and pwdignore will be true if no
  264.  * particular password was needed for this user.
  265.  */
  266. int
  267. userlogin(name,pass,path,len,pwdignore)
  268. char *name;
  269. char *pass;
  270. char **path;
  271. int len;            /* Length of buffer pointed at by *path */
  272. int *pwdignore;
  273. {
  274.     char *buf;
  275.     char *password;
  276.     char *directory;
  277.     int permission;
  278.     int anonymous;
  279.     char *cp;
  280.     if ( (buf = userlookup( name, &password, &directory,
  281.             &permission, NULL )) == NULLCHAR ) {
  282.         return -1;
  283.     }
  284.  
  285.     anonymous = *pwdignore;
  286.     if ( strcmp(password,"*") == 0 )
  287.         anonymous = TRUE;    /* User ID is password-free */
  288.  
  289.     if(!anonymous && strcmp(password,pass) != 0) {
  290.         /* Password required, but wrong one given */
  291.         free(buf);
  292.         return -1;
  293.     }
  294.  
  295.     if ( strlen( directory ) + 1 > len ) {
  296.         /* not enough room for path */
  297.         free(buf);
  298.         return -1;
  299.     }
  300.  
  301. #if   defined(AMIGA)
  302.     /*
  303.      * Well, on the Amiga, a file can be referenced by many names:
  304.      * device names (DF0:) or volume names (My_Disk:).  This hunk of code
  305.      * passed the pathname specified in the ftpusers file, and gets the
  306.      * absolute path copied into the user's buffer.  We really should just
  307.      * allocate the buffer and return a pointer to it, since the caller
  308.      * really doesn't have a good idea how long the path string is..
  309.      */
  310.     /* Hack to allow all devices by specifying '*' */
  311.     if ( directory[0] == '*' ) {
  312.         **path = '\0';
  313.     } else if ( (directory = pathname("", directory)) != NULLCHAR ) {
  314.         strcpy(*path, directory);
  315.         free(directory);
  316.     } else {
  317.         **path = '\0';
  318.     }
  319. #else
  320.     strcpy(*path,directory);
  321.     /* Convert any backslashes to forward slashes, for backward
  322.      * compatibility with the old NET
  323.      */
  324.     while((cp = strchr(*path,'\\')) != NULLCHAR)
  325.         *cp = '/';
  326. #endif
  327.     free(buf);
  328.     *pwdignore = anonymous;
  329.     /* Finally return the permission bits */
  330.     return permission;
  331. }
  332.  
  333.